/*********************************************************************************************************
 *  ------------------------------------------------------------------------------------------------------
 *  file description
 *  ------------------------------------------------------------------------------------------------------
 *         \file  coroutine_cfg.h
 *         \unit  coroutine
 *        \brief  This is a C language coroutine library
 *       \author  Lamdonn
 *      \version  v0.2.0
 *      \license  GPL-2.0
 *    \copyright  Copyright (C) 2025 Lamdonn.
 ********************************************************************************************************/
#ifndef __coroutine_cfg_H
#define __coroutine_cfg_H

/**
 * \brief Coroutine scheduler number
 * \note  This macro defines the number of coroutine schedulers
 */
#define COROUTINE_SCHEDULER_NUMBER                  1

/**
 * \brief Coroutine static task max number
 * \note  This macro defines the maximum number of coroutine tasks that can be created statically
 */
#define COROUTINE_STATIC_TASK_MAX_NUMBER            8

/**
 * \brief Coroutine static timer max number
 * \note  This macro defines the maximum number of coroutine timers that can be created statically
 */
#define COROUTINE_STATIC_TIMER_MAX_NUMBER           8

/**
 * \brief Coroutine static stack max number
 * \note  This macro defines the maximum number of coroutine stacks that can be created statically
 */
#define COROUTINE_STATIC_STACK_MAX_NUMBER           8

/**
 * \brief Coroutine stack default size
 * \note  This macro defines the default size of the coroutine stack
 * \note  If the coroutine stack size is not specified, this value will be used
 */
#define COROUTINE_STACK_DEFAULT_SIZE                10240 // 4096 // 

/**
 * \brief Coroutine enable stack calculate
 * \note  This macro defines whether to enable the stack calculate feature
 * \note  If enabled, the coroutine stack using will be calculated automatically
 */
#define COROUTINE_ENABLE_STACK_CALCULATE            1

/**
 * \brief Coroutine enable loading calculate
 * \note  This macro defines whether to enable the loading calculate feature
 * \note  If enabled, the coroutine loading will be calculated automatically
 */
#define COROUTINE_ENABLE_LOADING_CALCULATE          1

/**
 * \brief Coroutine loading queue size
 * \note  This macro defines the size of the coroutine loading queue
 */
#define COROUTINE_LOADING_CALCULATE_QSIZE           10

/**
 * \brief Coroutine loading calculate period
 * \note  This macro defines the period of the coroutine loading calculate
 * \note  The unit is ms
 */
#define COROUTINE_LOADING_CALCULATE_PERIOD          100

/**
 * \brief Stack get and set Pointers depending on the platform definition
 * \param p Pointer to the stack
 * \return None
 * \note  This macro is used to get and set the stack pointer depending on the platform definition
 * \note  For x86_32, the stack pointer is esp; for x86_64, the stack pointer is rsp; for arm, the stack pointer is sp
 * \note  Common platforms have been implemented, not implemented platforms need to be implemented by users
 */
#if defined(__i386__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %%esp, %0" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov %0, %%esp" : : "r" (p) : "memory")
#elif defined(__x86_64__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %%rsp, %0" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov %0, %%rsp" : : "r" (p) : "memory")
#elif defined(__arm__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %0, sp" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov sp, %0" : : "r" (p) : "memory")
#elif defined(__aarch64__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %0, sp" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov sp, %0" : : "r" (p) : "memory")
#elif defined(__mips__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile(".set noreorder\n\t" "move %0, $sp\n\t" ".set reorder" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile(".set noreorder\n\t" "move $sp, %0\n\t" ".set reorder" : : "r" (p) : "memory")
#elif defined(__riscv__)
#if __riscv_xlen == 32
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mv %0, sp" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mv sp, %0" : : "r" (p) : "memory")
#else
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mv %0, sp" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mv sp, %0" : : "r" (p) : "memory")
#endif
#elif defined(__powerpc__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mr %0, r1" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mr r1, %0" : : "r" (p) : "memory")
#elif defined(__powerpc64__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mr %0, r1" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mr r1, %0" : : "r" (p) : "memory")
#elif defined(__s390__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mr %0, r15" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mr r15, %0" : : "r" (p) : "memory")
#elif defined(__s390x__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mr %0, r15" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mr r15, %0" : : "r" (p) : "memory")
#elif defined(__sparc__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %%sp, %0" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov %0, %%sp" : : "r" (p) : "memory")
#elif defined(__sparcv9__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %%sp, %0" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov %0, %%sp" : : "r" (p) : "memory")
#elif defined(__tile__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %%sp, %0" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov %0, %%sp" : : "r" (p) : "memory")
#elif defined(__tilegx__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %%sp, %0" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov %0, %%sp" : : "r" (p) : "memory")
#elif defined(__hppa__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mr %0, r1" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mr r1, %0" : : "r" (p) : "memory")
#elif defined(__hppa64__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mr %0, r1" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mr r1, %0" : : "r" (p) : "memory")
#elif defined(__ia64__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %0=sp" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov sp=%0" : : "r" (p) : "memory")
#elif defined(__loongarch__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %0, sp" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov sp, %0" : : "r" (p) : "memory")
#elif defined(__m68k__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %0, sp" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov sp, %0" : : "r" (p) : "memory")
#elif defined(__mips64__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %0, sp" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov sp, %0" : : "r" (p) : "memory")
#elif defined(__parisc__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mr %0, r1" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mr r1, %0" : : "r" (p) : "memory")
#elif defined(__parisc64__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mr %0, r1" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mr r1, %0" : : "r" (p) : "memory")
#elif defined(__s390__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mr %0, r15" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mr r15, %0" : : "r" (p) : "memory")
#elif defined(__s390x__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mr %0, r15" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mr r15, %0" : : "r" (p) : "memory")
#elif defined(__sh__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %0, sp" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov sp, %0" : : "r" (p) : "memory")
#elif defined(__sh64__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("mov %0, sp" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("mov sp, %0" : : "r" (p) : "memory")
#elif defined(__xtensa__)
#define COROUTINE_GET_SP(p)                         __asm__ volatile("rsr.a1 %0" : "=r" (p) : : "memory")
#define COROUTINE_SET_SP(p)                         __asm__ volatile("wsr.a1 %0" : : "r" (p) : "memory")
#else 
#error "Unsupported platform, please implement `COROUTINE_GET_SP` and `COROUTINE_SET_SP`"
#endif

#endif // !__coroutine_cfg_H
